【Java消息队列】

您所在的位置:网站首页 jms 芯片 【Java消息队列】

【Java消息队列】

#【Java消息队列】| 来源: 网络整理| 查看: 265

概述 1.1 什么是JMS JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。JMS的优势 异步:JMS天生就是异步的,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端。 可靠:JMS保证消息只会递送一次。大家都遇到过重复创建消息问题,而JMS能帮你避免该问题,只是避免而不是杜绝,所以在一些糟糕的环境下还是有可能会出现重复。它类似于JDBC(Java DatabaseConnectivity):这里,JDBC 是可以用来访问许多不同关系数据库的API,而JMS同样提供与厂商无关的访问方式来访问消息收发服务 1.2 什么是MQ

MQ 消息队列

消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。 消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。 排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求

特点

MQ的消费-生产者模型的一个典型的代表,一端往消息队列中不断的写入消息,而另一端则可以读取或者订阅队列中的消息。

应用场景

在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。

1.3 什么是ActiveMQ

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

优点:

是一个快速的开源消息组件(框架),支持集群,同等网络,自动检测,TCP,SSL,广播,持久化,XA,和J2EE1.4容器无缝结合,并且支持轻量级容器和大多数跨语言客户端上的Java虚拟机。消息异步接受,减少软件多系统集成的耦合度。消息可靠接收,确保消息在中间件可靠保存,多个消息也可以组成原子事务。

缺点:

ActiveMQ默认的配置性能偏低,需要优化配置,但是配置文件复杂,ActiveMQ本身不提供管理工具;示例代码少;主页上的文档看上去比较全面,但是缺乏一种有效的组织方式,文档只有片段,用户很难由浅入深进行了解,二、文档整体的专业性太强。在研究阶段可以通过查maillist、看Javadoc、分析源代码来了解。

1.4 JMS、MQ及ActiveMQ的关系 JMS和MQ的关系: JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现可以基于JMS,也可以基于其他规范或标准。

MQ的实现可以基于JMS,也可以基于其他规范或标准,其中ActiveMQ就是基于JMS规范实现的消息队列。

JMS 2.1 JMS对象模型

JMS应用程序由如下基本模块组成:

1、管理对象(Administered objects)-连接工厂(Connection Factories)和目的地(Destination) 2、连接对象(Connections) 3、会话(Sessions) 4、消息生产者(Message Producers) 5、消息消费者(Message Consumers) 6、消息监听者(Message Listeners)

在这里插入图片描述

JMS由以下元素组成

JMS提供者 —— 连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器 (activemq,rabbitmq等)。

JMS客户 —— 生产或消费基于消息的Java的应用程序或对象(生产者和消费者)

JMS生产者 —— 创建并发送消息的JMS客户。(activemq 中体现为生成消息对象,并将对象存入消息队列中。)

JMS消费者 —— 接收消息的JMS客户。(activemq 中体现为获取消息队列中的消息对象,进行相应的业务处理)

JMS消息 —— 在JMS客户之间传递的数据的对象

JMS队列 —— 一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。

2.2 JMS 的两种消息传递类型

在这里插入图片描述

点对点模式(P2P)

在点对点消息传送模型中,应用程序由消息队列,发送者,接收者组成。每一个消息发送给一个特殊的消息队列,该队列保存了所有发送给它的消息(除了被接收者消费掉的和过期的消息)。 在这里插入图片描述 特性:

(1)、每个消息只有一个接受者(自己测试了一下,可以有多个接受者,但是当有多个接收者时,每个接收者只能获取随机的几条信息)

(2)、消息发送者和消息接受者并没有时间依赖性。

(3)、当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;

(4)、当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。

发布/订阅模式

在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端。在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅topic。topic主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

在这里插入图片描述

2.3 JMS对象类型

连接工厂(ConnectionFactory):利用连接工厂创建一个JMS连接。

JMS连接(Connection):表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。

JMS会话(Session):表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。

JMS目的(Destination):又称为消息队列,是实际的消息源。

生产者(Message Producer)和消费者(Message Consumer):对象由Session对象创建,用于发送和接收消息。

2.4 JMS接收消息

消息的接收可以使用以下两种方式:同步方式 和 异步方式

同步方式

使用同步方式接收消息的话,消息订阅者调用receive()方法。在receive()中,消息未到达或在到达指定时间之前,方法会阻塞,直到消息可用。 (1) 目的地是Queue

consumer = session.createConsumer(queue); Message message = consumer.receive(); //同步方式接收

(2)目的地是Destination

consumer = session.createConsumer(destination); //同步方式接受信息,如果还没有获取到则会阻塞直到接收到信息 Message messages = consumer.receive();

异步方式

使用异步方式接收消息的话,消息订阅者需注册一个消息监听者,类似于事件监听器,只要消息到达,JMS服务提供者会通过调用监听器的onMessage()递送消息。

异步方式接收是使用了监听方式:

consumer.setMessageListener(new MessageListener(){ @Override public void onMessage(Message message) { TextMessage textMessage = (TextMessage)message; try { String value = textMessage.getText(); System.out.println("value: "+value); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); 2.5 Spring整合JMS

-



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3